process.env.NODE_ENV = 'production'

const { say } = require('cfonts')
const chalk = require('chalk')
const del = require('del')
const webpack = require('webpack')
const Multispinner = require('multispinner')

const mainConfig = require('./webpack/main.config')
const rendererConfig = require('./webpack/renderer.config')
const resolveConfig = require('./utils/resolveConfig')
const buildApp = require('./electron-builder')

const doneLog = chalk.bgGreen.white(' DONE ') + ' '
const errorLog = chalk.bgRed.white(' ERROR ') + ' '
const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
const isCI = process.env.CI || false

const start = async () => {
    if (process.env.BUILD_TARGET === 'clean') {
        return clean()
    }

    let config = await resolveConfig()
    process.env.MODE = config.env

    console.log()

    if (config.target !== 'prepackaged' && config.rebuildJS) {
        await build()
    }
    buildApp(config)
}
start()

function clean() {
    del.sync(['build/*', '!build/icons', '!build/icons/icon.*'])
    console.log(`\n${doneLog}\n`)
    process.exit()
}

function build() {
    greeting()

    del.sync(['dist/electron/*', '!.gitkeep'])

    const tasks = ['main', 'renderer']
    const m = new Multispinner(tasks, {
        preText: 'building',
        postText: 'process'
    })

    let results = ''

    pack(mainConfig).then(result => {
        results += result + '\n\n'
        m.success('main')
    }).catch(err => {
        m.error('main')
        console.log(`\n  ${errorLog}failed to build main process`)
        console.error(`\n${err}\n`)
        process.exit(1)
    })

    pack(rendererConfig).then(result => {
        results += result + '\n\n'
        m.success('renderer')
    }).catch(err => {
        m.error('renderer')
        console.log(`\n  ${errorLog}failed to build renderer process`)
        console.error(`\n${err}\n`)
        process.exit(1)
    })

    return new Promise(resolve => {
        m.on('success', () => {
            process.stdout.write('\x1B[2J\x1B[0f')
            console.log(`\n\n${results}`)
            console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
            return resolve()
        })
    })
}

function pack(config) {
    return new Promise((resolve, reject) => {
        config.mode = 'production'
        webpack(config, (err, stats) => {
            if (err) {
                reject(err.stack || err)
            } else if (stats.hasErrors()) {
                let err = ''

                stats.toString({
                    colors: true,
                    chunks: false,
                    modules: false,
                    children: false
                }).split(/\r?\n/).forEach(line => err += `    ${line}\n`)

                reject(err)
            } else {
                resolve(stats.toString({
                    colors: true,
                    chunks: false,
                    modules: false,
                    children: false
                }))
            }
        })
    })
}

function greeting() {
    const cols = process.stdout.columns
    let text = ''

    if (cols > 85) text = 'lets-build'
    else if (cols > 60) text = 'lets-|build'
    else text = false

    if (text && !isCI) {
        say(text, {
            colors: ['yellow'],
            font: 'simple3d',
            space: false
        })
    } else console.log(chalk.yellow.bold('\n  lets-build'))
    console.log()
}